#include <stdlib.h>
#include <GL/glut.h>    // Header File For The GLUT Library 
#include <GL/gl.h>	// Header File For The OpenGL32 Library
#include <GL/glu.h>	// Header File For The GLu32 Library
#include <unistd.h>     // Header File For sleeping.

static GLint width = 640;
static GLint height = 480;

// prototypes
void InitGL(int Width, int Height);
void ReSizeGLScene(int Width, int Height);
void DrawGLScene();



int main(int argc, char **argv) 
{  
   glutInit(&argc, argv);  
   
   /* Select type of Display mode:   
      Double buffer 
      RGBA color
      Alpha components supported 
      Depth buffer */  
   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);  
   
   /* get a width x height window */
   glutInitWindowSize(width, height);  
  
   /* the window starts at the upper left corner of the screen */
   glutInitWindowPosition(0, 0);  

   /* Open a window */  
   glutCreateWindow("TEST");  

   /* Register the function to do all our OpenGL drawing. */
   glutDisplayFunc(&DrawGLScene);  

   /* Even if there are no events, redraw our gl scene. */
   glutIdleFunc(&DrawGLScene);

   /* Register the function called when our window is resized. */
   glutReshapeFunc(&ReSizeGLScene);

   /* Initialize our window. */
   InitGL(width, height);
  
   /* Start Event Processing Engine */  
   glutMainLoop();  

   return 1;
}





void InitGL(int Width, int Height)   // We call this right after our OpenGL window is created.
{
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // This Will Clear The Background Color To Black
   glClearDepth(1.0);		  // Enables Clearing Of The Depth Buffer
   glDepthFunc(GL_LESS);	  // The Type Of Depth Test To Do
   glEnable(GL_DEPTH_TEST);	  // Enables Depth Testing
   glShadeModel(GL_SMOOTH);	  // Enables Smooth Color Shading

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();		  // Reset The Projection Matrix

   
   gluOrtho2D(0.0,width,0.0,height); // (left,right,bottom,top)
   //gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);	// Calculate The Aspect Ratio Of The Window

   glMatrixMode(GL_MODELVIEW);
}






/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
void ReSizeGLScene(int Width, int Height)
{
   if (Height==0)				// Prevent A Divide By Zero If The Window Is Too Small
      Height=1;

   glViewport(0, 0, Width, Height);		// Reset The Current Viewport And Perspective Transformation

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0.0,(GLfloat)Width,0.0,(GLfloat)Height); // (left,right,bottom,top)
   //gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
   glMatrixMode(GL_MODELVIEW);
}

/* The main drawing function. */
void DrawGLScene()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Clear The Screen And The Depth Buffer
   glLoadIdentity();				// Reset The View

   // draw a square (quadrilateral)
   glBegin(GL_QUADS);				// start drawing a polygon (4 sided)
   glVertex2f(-1.0f, 1.0f);		// Top Left
   glVertex2f( 1.0f, 1.0f);		// Top Right
   glVertex2f( 1.0f,-1.0f);		// Bottom Right
   glVertex2f(-1.0f,-1.0f);		// Bottom Left	
   glEnd();					// done with the polygon

   // swap buffers to display, since we're double buffered.
   glutSwapBuffers();
}


